package com.xiao.tripmateai.rag;

import jakarta.annotation.Resource;
import org.springframework.ai.document.Document;
import org.springframework.ai.embedding.EmbeddingModel;
import org.springframework.ai.vectorstore.SimpleVectorStore;
import org.springframework.ai.vectorstore.VectorStore;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.List;

/**
 * 为了实现方便，先使用Spring AI内置的、基于内存读写的向量数据库SimpleVectorStore来保存文档。
 * 简单了解下源码，在将文档写入到数据库前，
 * 会先调用Embedding大模型将文档转换为向量，实际保存到数据库中的是向量类型的数据。
 */
@Configuration
public class AppVectorStoreConfig {

    @Resource
    private AppDocumentLoader tripAppDocumentLoader;

    /**
     * Spring AI通过Advisor特性提供了开箱即用的RAG 功能。
     * 主要是QuestionAnswerAdvisor问答拦截器和RetrievalAugmentationAdvisor检索增强拦截器，
     * 前者更简单易用、后者更灵活强大。
     * 查询增强的原理其实很简单。向量数据库存储着AI模型本身不知道的数据，
     * 当用户问题发送给AI模型时，QuestionAnswerAdvisor 会查询向量数据库，
     * 获取与用户问题相关的文档。然后从向量数据库返回的响应会被附加到用户文本中，
     * 为AI模型提供上下文，帮助其生成回答。
     * @param dashscopeEmbeddingModel
     * @return
     */
    @Bean
    VectorStore tripAppVectorStore(EmbeddingModel dashscopeEmbeddingModel) {
        SimpleVectorStore simpleVectorStore = SimpleVectorStore.builder(dashscopeEmbeddingModel)
                .build();
        // 加载文档
        List<Document> documents = tripAppDocumentLoader.loadMarkdowns();
        simpleVectorStore.add(documents);
        return simpleVectorStore;
    }
}
